<?php

// 设置响应内容类型
header('Content-Type: application/json');

// 允许所有来源跨域请求
header("Access-Control-Allow-Origin: *");
// 允许的请求方法
header("Access-Control-Allow-Methods: GET, OPTIONS");
// 允许的请求头
header("Access-Control-Allow-Headers: Content-Type");

// 定义一个 VideoAnalysis 类
class VideoAnalysis
{
    private $uid = '4812275'; // API 用户 ID
    private $key = 'nopqwyACDELUWY0128'; // API 密钥
    private $db; // 数据库连接对象
    private $maxRequestsPerDay = 300; // 每天的最大请求次数

    // 构造函数，建立数据库连接
    public function __construct()
    {
        $this->db = new mysqli('localhost', 'b7wvjkvc8', 'ny5cw568', 'b7wvjkvc8');
        if ($this->db->connect_error) {
            die("数据库连接失败: " . $this->db->connect_error);
        }
    }

    // 运行方法，处理请求
    public function run()
    {
        // 检查每天请求次数
        $requestCount = $this->checkRequestLimit();
        if ($requestCount === false) {
            echo json_encode([
                "code" => -1,
                "data" => null,
                "msg" => "解析次数已达到最大值" // 返回请求次数已达上限信息
            ]);
            return;
        }

        // 检查是否提供了 url 参数
        if (!isset($_GET['url'])) {
            echo json_encode([
                "code" => -1,
                "data" => null,
                "msg" => "缺少参数: url" // 返回缺少参数信息
            ]);
            return;
        }

        // 获取 url 参数
        $videoUrl = $_GET['url'];

        // 正则表达式，用于验证和提取有效链接
        $pattern = '/(https?|http):\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;]+[-A-Za-z0-9+&@#\/%=~_|]/';
        // 检查是否匹配正则表达式
        if (!preg_match($pattern, $videoUrl, $matches)) {
            echo json_encode([
                "code" => -1,
                "data" => null,
                "msg" => "无效的URL格式" // 返回无效URL格式信息
            ]);
            return;
        }

        // 提取有效的URL
        $validUrl = $matches[0];  // 只保存提取出的有效 URL

        // 调用分析方法
        $response = $this->analysis($validUrl);

        // 请求IP
        $clientIp = $_SERVER['REMOTE_ADDR'];
        // 请求时间
        $requestTime = date('Y-m-d H:i:s');

        // 如果成功解析，递增请求次数并记录请求日志
        if ($response['code'] == 200) {
            $this->incrementRequestCount();
            $requestCount++; // 增加当前请求次数

            // 记录到日志数据库
            $contentType = isset($response['data']['video']) ? 'video' : 'image';
            $this->logRequest($clientIp, $requestTime, $validUrl, $contentType, 'success'); // 保存的是提取后的有效 URL
        } else {
            // 解析失败记录日志
            $this->logRequest($clientIp, $requestTime, $validUrl, 'unknown', 'failure'); // 保存的是提取后的有效 URL
        }

        // 添加请求次数到返回的数据中
        $response['request_count'] = "当天第300/ $requestCount 次请求"; // 格式为“当天第300/ X 次请求”

        // 返回响应结果
        echo json_encode($response);
    }

    // 检查当天的请求次数
    private function checkRequestLimit()
    {
        $today = date('Y-m-d');

        // 查询当天的请求记录
        $stmt = $this->db->prepare("SELECT request_count FROM api_requests WHERE request_date = ?");
        $stmt->bind_param('s', $today);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();

        // 如果当天有记录，检查是否超过最大次数
        if ($row) {
            if ($row['request_count'] >= $this->maxRequestsPerDay) {
                return false; // 超过最大请求次数
            }
            return $row['request_count'];
        } else {
            // 如果没有记录，则插入新的一天
            $stmt = $this->db->prepare("INSERT INTO api_requests (request_date, request_count) VALUES (?, 0)");
            $stmt->bind_param('s', $today);
            $stmt->execute();
            return 0;
        }
    }

    // 递增当天的请求次数
    private function incrementRequestCount()
    {
        $today = date('Y-m-d');
        $stmt = $this->db->prepare("UPDATE api_requests SET request_count = request_count + 1 WHERE request_date = ?");
        $stmt->bind_param('s', $today);
        $stmt->execute();
    }

    // 记录API请求日志
    private function logRequest($ip, $time, $url, $contentType, $status)
    {
        $stmt = $this->db->prepare("INSERT INTO api_request_log (ip_address, request_time, request_url, content_type, response_status) VALUES (?, ?, ?, ?, ?)");
        $stmt->bind_param('sssss', $ip, $time, $url, $contentType, $status);
        $stmt->execute();
    }

    // 分析视频信息
    public function analysis($videoUrl)
    {
        try {
            // 构造请求的外部API URL
            $url = "http://apis.xiaofanmo.site/home/api?uid={$this->uid}&key={$this->key}&url=" . urlencode($videoUrl);
            // 获取外部API返回的数据
            $s = file_get_contents($url);
            $s = json_decode($s, true); // 将 JSON 数据解析为数组

            // 检查返回的状态码
            if ($s['code'] == '0001') {
                $s = $s['data']; // 获取返回的数据
                $reData = [
                    "title" => $s['desc'], // 视频标题
                    "cover" => $s['cover']  // 视频封面
                ];

                // 根据视频类型判断处理方式
                if ($s['type'] == '2') {
                    $reData['images'] = $s['pics']; // 如果是图片类型，提取图片数组
                } else {
                    $reData['video'] = $this->getUrl302($s['playAddr']); // 否则，处理视频地址
                }

                // 返回成功解析的结果
                return [
                    "code" => 200,
                    "data" => $reData,
                    "msg" => "解析成功" // 解析成功信息
                ];
            } else {
                // 返回解析失败的信息
                return [
                    "code" => -1,
                    "data" => null,
                    "msg" => "解析失败，不支持该平台"
                ];
            }
        } catch (Exception $e) {
            // 捕获异常并返回错误信息
            return [
                "code" => -1,
                "data" => null,
                "msg" => "解析失败，程序出错了" // 返回程序出错信息
            ];
        }
    }

    // 处理302重定向并获取最终URL
    private function getUrl302($url)
    {
        // 获取响应头
        $headers = get_headers($url, 1);
        // 如果存在Location头，说明发生重定向
        if (array_key_exists('Location', $headers)) {
            return $headers['Location']; // 返回重定向后的URL
        }
        return $url;  // 如果没有重定向，返回原URL
    }
}

// 创建 VideoAnalysis 类的实例并运行
$videoAnalysis = new VideoAnalysis();
$videoAnalysis->run();




// CREATE TABLE `api_requests` (
//     `id` INT(11) NOT NULL AUTO_INCREMENT,
//     `request_date` DATE NOT NULL,
//     `request_count` INT(11) NOT NULL DEFAULT 0,
//     PRIMARY KEY (`id`),
//     UNIQUE KEY `unique_request_date` (`request_date`)
//   );
  
//   CREATE TABLE `api_request_log` (
//     `id` INT(11) NOT NULL AUTO_INCREMENT,
//     `ip_address` VARCHAR(45) NOT NULL,
//     `request_time` DATETIME NOT NULL,
//     `request_url` TEXT NOT NULL,
//     `content_type` ENUM('video', 'image') NOT NULL,
//     `response_status` ENUM('success', 'failure') NOT NULL,
//     PRIMARY KEY (`id`)
//   );
  

// https://api.chatcm.top/muchuan.php?url=https://v.douyin.com/ihTwSVG4